gpt4 book ai didi

regex - 如果在行中找到字符串,则替换为上一行的字符串,sed

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:19 25 4
gpt4 key购买 nike

我有几千行代码分布在需要更新的多个文件中。现在他们是这样的:

active_data(COPIED),

我需要用上一行括号内的文本替换所有 COPIED 实例(仅在这些行中)。所以它总的代码目前可能看起来像:

current_data(FOO|BAR|TEXT),
active_data(COPIED),

我希望它看起来像:

current_data(FOO|BAR|TEXT),
active_data(FOO|BAR|TEXT),

我可以很容易地找到要替换的行,并且可以毫无问题地用一些静态字符串替换,但我不确定如何从上一行中提取数据并使用它。我敢肯定它很简单,但无法完全弄清楚。感谢您的帮助。

(如果 sed 不起作用,我也可以考虑为此使用 AWK 或其他工具,但我认为 sed 是一次性更改的最佳解决方案)。

最佳答案

sed 可以工作,但 awk 更自然:

$ awk -F'[()]' '$2 == "COPIED" {sub(/COPIED/, prev)} {prev=$2;} 1' file
current_data(FOO|BAR|TEXT),
active_data(FOO|BAR|TEXT),
  • -F'[()]'

    使用左括号或闭括号作为字段分隔符。

  • $2 == "COPIED"{sub("COPIED", prev)}

    如果第二个字段是COPIED,则将其替换为prev

  • prev=$2

    更新prev

  • 1

    这是隐含的速记,表示打印该行。它等同于 {print $0;}

awk 如何查看字段

$ awk -F'[()]' '{for (i=1;i<=NF;i++)printf "Line %s Field %s=%s\n",NR,i,$i;}' file
Line 1 Field 1=current_data
Line 1 Field 2=FOO|BAR|TEXT
Line 1 Field 3=,
Line 2 Field 1=active_data
Line 2 Field 2=COPIED
Line 2 Field 3=,

就地更改目录中的所有文件

for file in *
do
awk -F'[()]' '$2 == "COPIED" {sub("COPIED", prev)} {prev=$2;} 1' "$file" >tmp$$ && mv tmp$$ "$file"
done

或者,如果您有现代 GNU awk:

awk -i inplace -F'[()]' '$2 == "COPIED" {sub("COPIED", prev)} {prev=$2;} 1' *

关于regex - 如果在行中找到字符串,则替换为上一行的字符串,sed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31843909/

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