shell 如何搜索文本并复制/粘贴到下一行

vatpfxk5  于 2023-05-01  发布在  Shell
关注(0)|答案(2)|浏览(236)

我正在尝试编写一个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',
5cnsuln7

5cnsuln71#

如果ed可用/可接受,则类似于:

#!/bin/sh

ed -s file.txt <<-'EOF'
  g/SOME_WORD/t.\
  s//NEW_WORLD/
  g/[^,]$/s/$/,/
  ,p
  Q
EOF

一行:

printf '%b\n' 'g/SOME_WORD/t.\\\ns//NEW_WORLD/' 'g/[^,]$/s/$/,/' ,p Q | ed -s file.txt

使用shell变量,类似于:

#!/bin/sh

search_value="SOME_WORD"
replace_value="NEW_WORLD"
file_path="./abc.ts"

ed -s "$file_path" <<-EOF
  g|$search_value|t.\\
  s||$replace_value|g
  ,p
  Q
EOF
  • 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
  • ssed相同
  • || Double表示处理|$search_value|中的(前一个)匹配项
  • g后面的g表示从整行搜索。
  • 如果需要 in_place 编辑,请将Q更改为w
  • 卸下,p,使输出静音。
  • 参见GNU艾德
  • 参见POSIX ed
htzpubme

htzpubme2#

让我们首先假设你的字符串不包含正则表达式运算符(.* ...).
sed

from="SOME_WORD"
to="NEW_WORLD"
sed -ni "p;s/$from/$to/gp" "$file_path"

使用GNU awk

awk -i inplace -v from="SOME_WORD" -v to="NEW_WORLD" '
  {print} $0 ~ from {gsub(from, to); print}' "$file_path"

如果你的字符串可以包含正则表达式操作符,GNU awk应该是首选:

awk -i inplace -v from="SOM*_WO.D" -v to="NEW_WORLD" '
  {print}
  { p = 0
    while(i = index($0, from)) {
      $0 = substr($0, 1, i - 1) to substr($0, i + length(from))
      p = 1
    }
  } p' "$file_path"

相关问题