我想在多行如要替換的文件一行替換多行線在一個文件
我想更換一個特定的函數調用說
foo(1,2)
與
if (a > 1) {
foo(1,2)
} else {
bar(1,2)
}
我該怎麼做bash?
我想在多行如要替換的文件一行替換多行線在一個文件
我想更換一個特定的函數調用說
foo(1,2)
與
if (a > 1) {
foo(1,2)
} else {
bar(1,2)
}
我該怎麼做bash?
這是sed的s
命令是爲建:
shopt -s extglob
ORIG="foo(1,2)"
REP="if (a > 1) {
foo(1,2)
} else {
bar(1,2)
}"
REP="${REP//+(
)/\\n}"
sed "s/$ORIG/$REP/g" inputfile > outputfile
注意,REP="${REP//\+( )/\\n}"
線只需要如果要定義,我在第二行做了格式化的方式REP
。如果您剛剛在REP
中使用\n
和\t
開頭,可能會更簡單。響應OP的問題
編輯
要更改原始文件,而無需創建一個新的文件,用sed的--in-place
標誌,就像這樣:
sed --in-place "s/$ORIG/$REP/g" inputfile
請小心使用--in-place
標誌。在運行之前進行備份,因爲所有更改都是永久性的。
'shopt -s extglob'是必需的,加號前的反斜槓需要刪除。 –
@DennisWilliamson感謝您的支持。我有時會忘記,大多數人沒有默認開啓延長的通配符。反斜槓只是從測試中剩下的。 –
它正在工作,但我不確定這是什麼意思 'REP =「$ {REP // +( )/ \\ n}」' – ravi
ORIGINAL="foo(1,2)"
REPLACEMENT="if (a > 1) {
foo(1,2)
} else {
bar(1,2)
}"
while read line; do
if [ "$line" = "$ORIGINAL" ]; then
echo "$REPLACEMENT"
else
echo "$line"
fi
done </path/to/your/file> /path/to/output/file
這可能會爲你工作:
cat <<\! |
> a
> foo(1,2)
> b
> foo(1,2)
> c
> !
> sed '/foo(1,2)/c\
> if (a > 1) {\
> foo(1,2)\
> } else {\
> bar(1,2)\
> }'
a
if (a > 1) {
foo(1,2)
} else {
bar(1,2)
}
b
if (a > 1) {
foo(1,2)
} else {
bar(1,2)
}
c
如果我想就地改變它在我目前的文件,而不產生任何額外的文件。 – ravi
@ravi查看我的編輯。 –