54

特定の行から始めて、bashのファイルに行を挿入したいと思います。

各行は、配列の要素である文字列です

line[0]="foo"
line[1]="bar"
...

特定の行は「フィールド」です

file="$(cat $myfile)"
for p in $file; do
    if [ "$p" = 'fields' ]
        then insertlines()     #<- here
    fi
done
4

4 に答える 4

98

これはsedで行うことができます:sed 's/fields/fields\nNew Inserted Line/'

$ cat file.txt 
line 1
line 2 
fields
line 3
another line 
fields
dkhs

$ sed 's/fields/fields\nNew Inserted Line/' file.txt 
line 1
line 2 
fields
New Inserted Line
line 3
another line 
fields
New Inserted Line
dkhs

-iに印刷する代わりに、インプレースで保存するために使用しますstdout

sed -i 's/fields/fields\nNew Inserted Line/'

bashスクリプトとして:

#!/bin/bash

match='fields'
insert='New Inserted Line'
file='file.txt'

sed -i "s/$match/$match\n$insert/" $file
于 2012-11-09T21:51:17.767 に答える
11

または、1つの例にsed:を付けてください。

ファイルを準備しtest.txtます。

echo -e "line 1\nline 2\nline 3\nline 4" > /tmp/test.txt

cat /tmp/test.txt
line 1
line 2
line 3
line 4

ファイルに新しい行を追加しtest.txtます。

sed -i '2 a line 2.5' /tmp/test.txt
# sed for in-place editing (-i) of the file: 'LINE_NUMBER a-ppend TEXT_TO_ADD'

cat /tmp/test.txt
line 1
line 2
line 2.5
line 3
line 4
于 2019-11-18T01:38:35.040 に答える
7

これは間違いなく、シェルループで一度に1行ずつ読み取るのではなく、sed(またはawkまたは)のようなものを使用したい場合です。perlこれは、シェルがうまくまたは効率的に行うようなものではありません。

再利用可能な関数を作成すると便利な場合があります。これは単純なものですが、完全に任意のテキストでは機能しません(スラッシュまたは正規表現のメタ文字は物事を混乱させます):

function insertAfter # file line newText
{
   local file="$1" line="$2" newText="$3"
   sed -i -e "/^$line$/a"$'\\\n'"$newText"$'\n' "$file"
}

例:

$ cat foo.txt
Now is the time for all good men to come to the aid of their party.
The quick brown fox jumps over a lazy dog.
$ insertAfter foo.txt \
   "Now is the time for all good men to come to the aid of their party." \
   "The previous line is missing 'bjkquvxz.'"
$ cat foo.txt
Now is the time for all good men to come to the aid of their party.
The previous line is missing 'bjkquvxz.'
The quick brown fox jumps over a lazy dog.
$ 
于 2012-11-09T22:11:16.267 に答える
-1

sedはあなたの友達です:

:~$ cat text.txt 
foo
bar
baz
~$ 

~$ sed '/^bar/\na this is the new line/' text.txt > new_text.txt
~$ cat new_text.txt 
foo
bar
this is the new line
baz
~$ 
于 2012-11-09T21:51:12.757 に答える