Создание новых файлов из исходного текста

У меня есть текстовый файл, и в этом текстовом файле есть несколько строк, которые начинаются с #. То, что я пытаюсь сделать, это сделать новые файлы из строк, которые начинаются с #. Так, например, в текстовом файле, если есть строка, которая начинается с текста «# FutureExams», то скрипт возьмет эту строку и сделает новый файл под названием FutureExams.txt сценарий, который я придумал в настоящее время работает, но не дает мне никакого результата.

find . -name "Data.txt" | while read line; do 
    if [ "$line" == "#"* ]; then 
        touch "$line".txt
    fi
done

Возможно, есть более простой способ написания сценария.

3 ответа

  1. Вы можете использовать трубу GNU sed и xargs, как это

    sed -rn "/^#/ {s/^#(.*)/
    	

    You could use a pipe of GNU sed and xargs like this

    sed -rn "/^#/ {s/^#(.*)/\1.txt/g;p}" Data.txt | xargs touch
    
    • the sed filters for lines starting with # and apply the s and p commands to such lines
    • the s command captures everything following the # into \1 for reuse in the replacement part, where it appends .txt to it
    • the p command prints the modified string to the pipe
    • the xargs forwards each string to the touch command

    You can try below program -

    vipin@kali:~$ cat kk.txt
    vipin
    #file1.txt
    kumar
    #file2.txt
    vipin@kali:~$ cat kk.sh
    while read line
    do
    var1=`cut -c1 <<<$line`          ### cut first character
    if [ "$var1" == "#" ]; then
       var2=`cut -c2- <<<$line`      ### cut from 2nd till last character of line
       touch $var2                   ### create file
    fi
    done < kk.txt
    vipin@kali:~$ date
    Sat Oct 29 22:10:27 EDT 2016
    vipin@kali:~$ ./kk.sh
    vipin@kali:~$ ls -ltr |tail -2
    -rw-r--r-- 1 vipin vipin     0 Oct 29 22:10 file1.txt
    -rw-r--r-- 1 vipin vipin     0 Oct 29 22:10 file2.txt
    

    A simple one-liner using grep, cut and touch:

    for i in $(grep '^#' Data.txt |cut -c2-); do touch "$i".txt; done

    .txt/g;p}" Data.txt | xargs touch

    • sed фильтрует строки, начинающиеся с # , и применяет команды sand pк таким строкам
    • sкоманда захватывает все, что следует за # into

      You could use a pipe of GNU sed and xargs like this

      sed -rn "/^#/ {s/^#(.*)/\1.txt/g;p}" Data.txt | xargs touch
      
      • the sed filters for lines starting with # and apply the s and p commands to such lines
      • the s command captures everything following the # into \1 for reuse in the replacement part, where it appends .txt to it
      • the p command prints the modified string to the pipe
      • the xargs forwards each string to the touch command

      You can try below program -

      vipin@kali:~$ cat kk.txt
      vipin
      #file1.txt
      kumar
      #file2.txt
      vipin@kali:~$ cat kk.sh
      while read line
      do
      var1=`cut -c1 <<<$line`          ### cut first character
      if [ "$var1" == "#" ]; then
         var2=`cut -c2- <<<$line`      ### cut from 2nd till last character of line
         touch $var2                   ### create file
      fi
      done < kk.txt
      vipin@kali:~$ date
      Sat Oct 29 22:10:27 EDT 2016
      vipin@kali:~$ ./kk.sh
      vipin@kali:~$ ls -ltr |tail -2
      -rw-r--r-- 1 vipin vipin     0 Oct 29 22:10 file1.txt
      -rw-r--r-- 1 vipin vipin     0 Oct 29 22:10 file2.txt
      

      A simple one-liner using grep, cut and touch:

      for i in $(grep '^#' Data.txt |cut -c2-); do touch "$i".txt; done

      для повторного использования в заменяющей детали, где она добавляет .txtк нему

    • команда p выводит измененную строку в канал
    • xargs передает каждую строку команде touch
  2. Вы можете попробовать ниже программы —

    vipin@kali:~$ cat kk.txt
    vipin
    #file1.txt
    kumar
    #file2.txt
    vipin@kali:~$ cat kk.sh
    while read line
    do
    var1=`cut -c1 <<<$line`          ### cut first character
    if [ "$var1" == "#" ]; then
       var2=`cut -c2- <<<$line`      ### cut from 2nd till last character of line
       touch $var2                   ### create file
    fi
    done < kk.txt
    vipin@kali:~$ date
    Sat Oct 29 22:10:27 EDT 2016
    vipin@kali:~$ ./kk.sh
    vipin@kali:~$ ls -ltr |tail -2
    -rw-r--r-- 1 vipin vipin     0 Oct 29 22:10 file1.txt
    -rw-r--r-- 1 vipin vipin     0 Oct 29 22:10 file2.txt
    
  3. Простой ОДН-вкладыш используяgrep, cutи touch:

    for i in $(grep '^#' Data.txt |cut -c2-); do touch "$i".txt; done