web-dev-qa-db-ja.com

パターンの前と行番号の後にsedを使用して行を挿入する方法は?

パターンの前と行番号の後にsedを使用してファイルに行を挿入する方法は?そして、シェルスクリプトで同じを使用する方法は?

これにより、パターンを持つすべての行の前に行が挿入されます。

sed '/Sysadmin/i \ Linux Scripting' filename.txt

そして、これは行番号の範囲を使用してこれを変更します:

sed '1,$ s/A/a/'

では、これらの両方(私はできませんでした)を使用して、パターンの前と行番号または別の方法の後にsedを使用してファイルに行を挿入する方法を教えてください。

28
Nohsib

Sedスクリプトファイルを記述して使用できます。

sed -f sed.script file1 ...

または、(複数)-e 'command'オプション:

sed -e '/SysAdmin/i\
Linux Scripting' -e '1,$s/A/a/' file1 ...

行の後に何かを追加する場合:

sed -e '234a\
Text to insert after line 234' file1 ...
26

現在の行番号が特定の値より大きい場合にのみ、パターンの前に行を挿入すると仮定します(つまり、パターンが行番号の前にある場合は、何もしません)

sedに縛られていない場合:

awk -v lineno=$line -v patt="$pattern" -v text="$line_to_insert" '
    NR > lineno && $0 ~ patt {print text}
    {print}
' input > output
8
glenn jackman

ファイル内の行の前に行を挿入する方法の例を次に示します。

サンプルファイルtest.txt:

hello line 1
hello line 2
hello line 3

脚本:

sed -n 'H;${x;s/^\n//;s/hello line 2/hello new line\n&/;p;}' test.txt > test.txt.2

出力ファイルtest.txt.2

hello line 1
hello new line
hello line 2
hello line 3

NB! sedがスペースのない改行の置換を開始していることに注意してください-これが必要です

スクリプトは「hello line 2」を含む行を検出し、次に新しい行を挿入します-「hello new line」

sedコマンドの説明:

sed -n:
suppress automatic printing of pattern space

H;${x;s/test/next/;p}

/<pattern>/  search for a <pattern>
${}  do this 'block' of code
H    put the pattern match in the hold space
s/   substitute test for next everywhere in the space
x    swap the hold with the pattern space
p    Print the current pattern hold space. 
1
serup

シンプル?行12から最後まで:

sed '12,$ s/.*Sysadmin.*/Linux Scripting\n&/' filename.txt
0
Walter A