gpt4 book ai didi

linux - 遍历文件并用 sed 替换每一行

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:26 24 4
gpt4 key购买 nike

我有以下 bash 脚本:

while IFS= read -r line; do
line=$(echo $line | sed "s/\'/\'\'/")

[[ $line =~ ^\<ID\>(.*) ]] && printf "${BASH_REMATCH[1]}"
done < <(dos2unix < file)

没有 dos2unix 的脚本的编辑版本:

while IFS= read -r line && line=${line%$'\r'}; do
[[ $line =~ ^\<ID\>(.*) ]] && printf "${BASH_REMATCH[1]}"
done < file

我想用 2 个撇号替换"file"中的每个撇号 BEFORE 我循环遍历它。我怎样才能做到这一点?如果您对这两个版本中的任何一个有任何建议,我将不胜感激。重要不允许修改原始文件!!

最佳答案

这是 sed 的工作独自一人:

sed 's/\r$//;s/\'/\'\'/g;s/^<ID>\(.*\)/\1/p;d' < file

步骤是:

  1. sed接受以换行符、分号分隔或以多个形式给出的多个命令 -e选项。
  2. sed 's/\r$//;删除每行末尾的 CR,如 dos2unix .
  3. g标记添加到 s/\'/\'\'/表示替换行中出现的所有;默认是只替换一个。
  4. s/^<ID>\(.*\)/\1/ bash 正则表达式匹配和 p 是否等效末尾的标志使 sed 现在打印匹配行,因为
  5. d命令删除该行,因此默认情况下不会打印它(您可以使用 -n 选项代替)。

附带说明一下,我的 zsh 不接受 \'' , 所以我可能会写它

sed -n -e 's/\r$//' -e "s/'/''/g" -e 's/^<ID>\(.*\)/\1/p'

它应该是等效的,只是切换引号样式、单独的选项和 -n而不是最终 d .

关于linux - 遍历文件并用 sed 替换每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43368077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com