【问题标题】:sed bash substitution only if variable has a value仅当变量具有值时 sed bash 替换
【发布时间】:2014-10-23 14:22:27
【问题描述】:

我正在尝试找到一种方法,使用变量和 sed 来使用不断变化的输入文件进行特定的文本替换,但前提是有一个值可以替换现有的字符串。没有值 = 什么都不做(而不是删除现有的字符串)。

示例 Substitute.csv 包含 5 行=

this-has-text
this-has-text

this-has-text
this-has-text

而file.text只有一句话=

"When trying this I want to be sure that text-this-has is left alone."

如果我在 shell 脚本中运行以下命令

Text='text-this-has'
Change=`sed -n '3p' substitute.csv`
grep -rl $Text /home/username/file.txt | xargs sed -i "s|$Text|$Change|"

我结束了

"When trying this I want to be sure that is left alone."

但我希望它保持原样

"When trying this I want to be sure that text-this-has is left alone."

有什么方法可以告诉 sed“如果我没有给你任何新的东西,什么都不做”?


对于我想太多的坏习惯,我深表歉意。基本上我想要完成的是 csv 文件的第 3 行是否有值 - 将 $Text 替换为 $Change inline。如果该行为空,则将 $Text 保留为 $Text。

【问题讨论】:

  • 在去sed之前检查$Change是否为空?
  • 哇,你把这个问题弄得比原来要复杂得多!所有关于从文件中读取第三行并将 greps 通过管道传输到 xargs 的所有内容都完全无关紧要,因此浪费了我们的时间试图理解所有内容并混淆了这个非常简单的问题。

标签: bash shell sed


【解决方案1】:
Text='text-this-has'
Change=$(sed -n '3p' substitute.csv)
if [[ -n $Change ]]; then
    grep -rl $Text /home/username/file.txt | xargs sed -i "s|$Text|$Change|"
fi

【讨论】:

【解决方案2】:

保持简单并使用 awk:

awk -v t="$Text" -v c="$Change" 'c!=""{sub(t,c)} {print}' file

如果您需要就地编辑,只需使用带有-i inplace 的 GNU awk。

鉴于您明确的要求,这可能是您真正想要的:

awk -v t="$Text" 'NR==FNR{if (NR==3) c=$0; next} c!=""{sub(t,c)} {print}' Substitute.csv file.txt

【讨论】:

  • 我真的很喜欢这种方法的简单性。我刚刚开始熟悉 sed,还没有处理 awk。我想替换内联文本并继续执行下一个命令。您能否提供一个实施 gawk 的示例。我尝试了几种我认为是正确的方法,但没有运气。
  • @user2416772 sed 是一个出色的工具,可以在单行上进行简单替换,但对于其他任何事情,您都应该使用 awk。不过,我不明白您的要求 - 请编辑您的原始问题以显示您的新要求的示例输入和预期输出,或者在此处接受答案并发布新问题。
  • @jaypal 别担心,每个人都记得差点写了E=MC2.. 哦,等等.... :-)。
【解决方案3】:

在启动grepsed 之前测试$Change 是否具有值无疑是最有效的bash 解决方案,尽管我对grepsed 的重复有点怀疑;它会在不包含目标字符串的文件的情况下保存一个临时文件,但在包含它的文件的情况下会额外扫描直到匹配。

不过,如果您正在寻找打字效率,以下内容可能会很有趣:

find . -name '*.txt' -exec sed -i "s|$Text|${Change:-&}|" {} \;

这将递归查找名称以扩展名.txt 结尾的所有文件,并对每个文件执行sed 命令。 ${Change:-&} 表示“$Change 的值如果存在且非空,否则为 &”; & 在替换 sed s 命令时表示“匹配的文本”,因此 s|foo|&| 将每次出现的 foo 替换为自身。这是一个昂贵的空操作,但如果你的时间比你的 CPU 时间更重要,那么它可能是值得的。

【讨论】:

    猜你喜欢
    • 2011-12-02
    • 2021-11-20
    • 2014-09-08
    • 1970-01-01
    • 2015-11-10
    • 2017-08-02
    • 2018-07-28
    • 2017-04-16
    • 1970-01-01
    相关资源
    最近更新 更多