我正在尝试编写一个shell脚本来查找SOME_WORD
。如果我找到一个,我想复制整行并粘贴到下一行,并将SOME_WORD
替换为NEW_WORLD
。
谢谢你的帮助!!
当前 shell 脚本
search_value="SOME_WORD"
file_path="./abc.ts"
# line=$(grep "$search_value" "$file_path")
if [ -z "$file_path" ]; then
echo "Value not found"
exit 1
fi
# Search file for variable and copy next line
while read -r line
do
if [[ "$line" == *"$search_value"* ]]; then
read -r next_line
sed -i "/$line/{p; s/.*/$next_line\\
&/}" "$file_path"
fi
done < "$file_path"
之前
SOME_WORD_1: 'ABC',
BAD_WORD_1: 'ABC',
SOME_WORD_2: 'ABC',
BAD_WORD_1: 'ABC',
SOME_WORD_3: 'ABC'
之后
SOME_WORD_1: 'ABC',
NEW_WORLD_1: 'ABC',
BAD_WORD_1: 'ABC',
SOME_WORD_2: 'ABC',
NEW_WORLD_2: 'ABC',
BAD_WORD_1: 'ABC',
SOME_WORD_3: 'ABC',
NEW_WORLD_3: 'ABC',
2条答案
按热度按时间5cnsuln71#
如果
ed
可用/可接受,则类似于:一行:
使用shell变量,类似于:
ed
脚本使用HEREDOC(EOF和EOF)−s
禁止e、E、r和w命令写入字节计数以及'!'在a!命令g|$search_value|t.
g
表示全局模式搜索从第一行/缓冲器开始到最后一行/缓冲器。$search_value
是shell变量。t
表示复制,在本例中复制| |
中的模式.
表示复制到同一行缓冲区,效果是重复行。\\
第二个\
只是模式搜索的延续,第一个\
是为了从shell中逃脱第二个\
,因为它是shell的特殊部分。g/./t.
显示复制每一行的示例。s||$replace_value|g
s
与sed
相同||
Double表示处理|$search_value|
中的(前一个)匹配项g
后面的g
表示从整行搜索。Q
更改为w
。,p
,使输出静音。htzpubme2#
让我们首先假设你的字符串不包含正则表达式运算符(
.
,*
...).sed
:使用GNU
awk
:如果你的字符串可以包含正则表达式操作符,GNU
awk
应该是首选: