Вставить текст в определенные строки файла?

Существует лидер группы процесса - вид подобных главный процесс - который владеет терминалом,/dev/tty. Группа процесса может быть одним или несколькими процессами.

stty управляют изменениями и настройками терминала дисплеев. Если Вы на самом деле собираетесь использовать UNIX, серьезно рассматривают нахождение, что копия Stevens 'Усовершенствовала Программирование в Среде UNIX'. Терминалы имеют много тяжелого багажа с 1970-х. Вы определите это сразу же. Большинство тех нечетных настроек может быть проигнорировано за исключением специальных вещей как системные консоли UNIX.

4
02.11.2013, 19:31
6 ответов
awk 'NR==1{print "Exp1"}NR==5{print "Exp2"}1' file

1 в средствах конца {print}.

sed '1i\
Exp1
5i\
Exp2
' file

Если Вы хотите расширить его до большего количества чисел, awk делает это легким:

awk 'NR%4==1{print "Exp"++i}1' file

С различными числами мы просто скажем, что sed не является правильным инструментом для задания. Это возможно, но не симпатично.


Как академическое любопытство, здесь это находится в sed:

sed '1{ 
    h
    s/^.*$/Exp0/
    x   
}
x
s/^4//
s/^3/4/
s/^2/3/
s/^1/2/
/^E/ { 
    s/$/|/
    :x
    s/0|/1/
    s/1|/2/
    s/2|/3/
    s/3|/4/
    s/4|/5/
    s/5|/6/
    s/6|/7/
    s/7|/8/
    s/8|/9/
    s/9|/|0/
    tx
    s/^Exp|/Exp1/
    p
    s/^/1/
}
x' file
6
27.01.2020, 20:50
  • 1
    Связанный (потому что я иду ed разгул: v) - то, как сделать это с редактором: printf '%s\n' 1 i Exp1 . 5 i Exp2 . w q | ed file.txt. Я сохраняю это как комментарий, а не ответ, потому что я не думаю, что любой будет на самом деле использовать этот lol. –  evilsoup 02.11.2013, 22:11
  • 2
    . Это помогло мне в моем случае... Позже я могу, вероятно, переместить это в фактический сценарий жемчуга, где я генерирую свои демонстрационные значения. –  Armen 10.11.2013, 17:15
  • 3
    необходимо будет записать новую версию во временный файл и затем переместить временный файл в местоположение исходного файла для выполнения этой задачи. stackoverflow.com/a/8019641/3822261 –  Matt Kleinsmith 15.02.2018, 05:25

Если количество точек данных (я принимаю) в каждом из Ваших экспериментов (снова, я принимаю) всегда равняется 4, можно использовать эту остроту Perl:

perl -ple '$. % 4 == 1 and print "Exp", ++$i' your_file

Как это работает

  • -p переключатель говорит Perl циклично выполняться по данному файлу (файлам) линию за линией (по умолчанию) и печатать каждую строку после выполнения безотносительно кода, который Вы предоставляете.
  • -l переключатель говорит Perl автоматически добавлять новую строку (по умолчанию) каждому print оператор.
  • -e переключатель сообщает Perl что независимо от того, что прибывает после того, как это - код для выполнения (код, который будет выполнен перед, каждая строка файла печатается).
  • Специальная переменная $. содержит номер строки, в настоящее время обрабатываемый. Если тот номер строки является конгруэнтным 1 4 по модулю ($. % 4 = 1) это означает, что мы должны вставить Exp # перед ним.
  • Таким образом, мы тестируем $. % 4 == 1 и если это верно, мы печатаем Exp ++$i\n (где \n был добавлен -l переключатель). Это работает, потому что неопределенной переменной дает значение нуля Perl, когда это сначала используется в качестве целого числа.

Заставить его работать с несколькими файлами

  • $. переменная не сбросит свое значение при обработке нескольких файлов сразу. Очевидно, это не то, что Вы хотите. Можно работать вокруг этого путем явного выписывания неявного цикла, созданного -p в вышеупомянутой остроте, таким образом, можно управлять continue блок.

    perl -le '
        while(<>){
            $. % 4 == 1 and print "Exp ",++$i
        } continue {
            print;             # Print the current line
            if(eof){           # If the next line is the end-of-file
                close ARGV ;   # Close the current filehandle to reset $.
                $i = 0     ;   # Reset the experiment counter if you need
            }
        }
    ' list_of_your_files
    

Примечания

  • Оба из вышеупомянутых решений распечатают измененный файл (файлы) к стандартному выводу. Чтобы эмулировать редактирование на месте (т.е. отредактировать сами файлы), добавьте a -i переключатель:

    perl -pi -le '$. % 4 == 1 and print "Exp", ++$i' your_file
    
    • Продолжите двигаться так же для другого решения.
    • Удостоверьтесь, что Вы не помещаете другой переключатель непосредственно после -i поскольку это интерпретирует что-либо после него как расширение использования для создания файла резервной копии.

    • Я рекомендую протестировать без -i сначала и затем добавьте его, если результаты являются удовлетворительными.

2
27.01.2020, 20:50

Вам не нужны внешние языки, несколько стандартных команд могут помочь. Например, чтобы вставить что-нибудь в 5-ю строку origin.txt можно сделать:

tmpfile=`mktemp`
head -n4 origin.txt > $tmpfile
echo "I'm line 5 now" >> $tmpfile
tail -n +5 origin.txt >> $tmpfile
mv $tmpfile origin.txt
0
27.01.2020, 20:50

Я нашел этот вопрос в поисках способа добавить символ комментария (#)в начало назначенной строки в файле. Используя приведенный выше пример и несколько других, я обнаружил, что это команда awk для печати чего-либо в назначенной строке.

awk 'NR==1{print "#"$0; next}1' <file

Строка NR==1— это линия, которую следует учитывать.
print "#"есть что добавить $0вставляет в строку, содержащую оставшуюся часть строки под указанным номером nextговорит ему пропустить эту строку (распечатав ее, иначе вы получите ее дважды )и, как упоминалось выше, завершающий 1вставляет остальную часть файла.

0
27.01.2020, 20:50

Объединитьheadиtail

cat <(head -n4 input) <(echo 'Line 5!') <(tail -n +5 input) > output

Замените inputвашим входным файлом и outputвашим выходным файлом.

Преимущества этого метода:

  • Позволяет вставить текст из третьего файла :просто замените echo line 5!наcat file-to-insert.txt
  • Нет длинного непостижимого синтаксиса
  • Нет внешнего программного обеспечения, которое может быть недоступно (awk, sed,perl)
  • Поддержка многострочных вставок (сложнее с awkиsed)

Недостатки для конкретной рассматриваемой ситуации:

  • Это усложняется, если вам нужно несколько вставок
2
21.05.2020, 14:46

Однострочная команда Perl решит эту проблему:

perl -i -lpe 'print "the line content" if $. == lineNumber' file_name.txt
0
19.11.2020, 21:56

Теги

Похожие вопросы