web-dev-qa-db-ja.com

Bashを使用して、特定の行の前に複数行のテキストを挿入します

特定の行の前に数行のテキストを挿入しようとしていますが、改行文字を追加しようとするとsedエラーが発生し続けます。私のコマンドは次のようになります:

sed -r -i '/Line to insert after/ i Line one to insert \\
    second new line to insert \\
    third new line to insert' /etc/directory/somefile.txt

報告されるエラーは次のとおりです。

sed: -e expression #1, char 77: unterminated `s' command

\n\\(例のように)を使用して、文字をまったく使用せずに、2行目を次の行に移動してみました。私も次のようなことを試しました:

sed -r -i -e '/Line to insert after/ i Line one to insert'
    -e 'second new line to insert'
    -e 'third new line to insert' /etc/directory/somefile.txt

編集!:お詫びします。テキストを既存の前ではなく前に挿入したかったのです。

7
MeanwhileInHell

これは機能するはずです:

sed -i '/Line to insert after/ i Line one to insert \
second new line to insert \
third new line to insert' file
10
anubhava

個々の行の単純な置換以外の場合は、単純さ、明快さ、堅牢性などのために、sedの代わりにawkを使用してください。

行の前に挿入するには:

awk '
/Line to insert before/ {
    print "Line one to insert"
    print "second new line to insert"
    print "third new line to insert"
}
{ print }
' /etc/directory/somefile.txt

行の後に挿入するには:

awk '
{ print }
/Line to insert after/ {
    print "Line one to insert"
    print "second new line to insert"
    print "third new line to insert"
}
' /etc/directory/somefile.txt
6
Ed Morton

挿入される行がコマンド「mycmd」(cat results.txtprintf "%s\n" line{1..3}など)の結果である場合は、次のことができます。

sed -i 's/Line to insert after/r' <(cmd) file
or 
sed -i 's/Line to insert after/echo "&";cmd/e' file

最後のコマンドは、一致するものを挿入する場合に簡単に変更できますbefore

1
Walter A

これは最初の行から機能します。例:ファイルの3行目から挿入する場合は、「1i」を「3i」に置き換えます。

sed -i '1i line1'\\n'line2'\\n'line3' 1.txt 

cat 1.txt

 line1
 line2
 line3
 Hai
0
vishnu raja

POSIXに準拠し、OS Xで実行するために、次のものを使用しました(一重引用符で囲まれた行と空の行はデモンストレーション用です)。

sed -i "" "/[pattern]/i\\
line 1\\
line 2\\
\'line 3 with single quotes\`
\\
" <filename>
0
Andi

MacOでは、さらにいくつかのものが必要でした。

  • iの後の二重円記号
  • -iの後の引用符を空にして、バックアップファイルを指定しない
  • 先頭の空白を追加するための先頭の円記号
  • 改行を追加するための末尾の二重円記号

このコードは、pom.xmlで</pluginsの最初のインスタンスを検索し、その直前に改行文字で区切られた別のXMLオブジェクトを挿入します。

sed -i '' "/\<\/plugins/ i \\
\            <plugin>\\
\                <groupId>org.Apache.maven.plugins</groupId>\\
\                <artifactId>maven-source-plugin</artifactId>\\
\                <executions>\\
\                    <execution>\\
\                        <id>attach-sources</id>\\
\                        <goals>\\
\                            <goal>jar</goal>\\
\                        </goals>\\
\                    </execution>\\
\                </executions>\\
\            </plugin>\\
" pom.xml
0
Mark

これはあなたのために働くかもしれません(GNU sed&Bash):

sed -i $'/Line to insert after/a\line1\\nline2\\nline3' file
0
potong

これはPerlでも簡単に実行できます

$ cat MeanwhileInHell.txt
Iran|XXXXXX|Iranian
Iraq|YYYYYY|Iraquian
Saudi|ZZZZZ|Saudi is a Rich Country
USA|AAAAAA|USA is United States of America.
India|IIII|India got freedom from British.
Scot|SSSSS|Canada Mexio.
$ Perl -pe 'BEGIN {$x="Line one to insert\nLine 2\nLine3\n"} $_=$x.$_ if /USA/ ' MeanwhileInHell.txt
Iran|XXXXXX|Iranian
Iraq|YYYYYY|Iraquian
Saudi|ZZZZZ|Saudi is a Rich Country
Line one to insert
Line 2
Line3
USA|AAAAAA|USA is United States of America.
India|IIII|India got freedom from British.
Scot|SSSSS|Canada Mexio.
$
0
stack0114106
sed -i '/Line to insert after/ i\
Line one to insert\
second new line to insert\
third new line to insert' /etc/directory/somefile.txt
0
Mahesh Kharvi