【问题标题】:sed script replacing string "\n" in string with newline charactersed 脚本用换行符替换字符串中的字符串“\n”
【发布时间】:2020-07-23 08:25:08
【问题描述】:

我最近编写了一个脚本,它将解析一大堆文件并在整个过程中递增版本号。该脚本适用于除一个之外的所有文件。它使用以下 sed 命令(从各种 google 搜索和非常有限的 sed 知识拼凑而成)在 .tex 文件中查找一行并增加版本号。

sed -i -r 's/(.*)(VERSION\}\{0.)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' fileName.tex

上述问题(我不确定如何解决)是它发现要更改的行显示为

\newcommand{\VERSION}{0.123},

并且sed命令将上面一行中的“\n”替换为换行符,从而输出

ewcommand{\VERSION}{0.124}(前面有一个换行符)。

期望的输出是:

\newcommand{\VERSION}{0.124}

我该如何解决这个问题?

【问题讨论】:

  • 不要为此使用sed。使用awk
  • 反斜杠的处理方式一直不同,用echo \1\2$((\3+1))\4查看输出,不带引号,\n停止被解析为换行符,但V之前的\现在已删除。见上面的评论。
  • 您想将 0.123 增加 0.001 还是将 123 增加 1?
  • @Cyrus 查看所需的输出。我想两者实际上都可以工作。
  • @WiktorStribiżew 删除 echo 命令中的引号会删除输出中的所有反斜杠。我会研究awk,以前从未使用过。

标签: string bash shell sed newline


【解决方案1】:

使用awk,不会被带有特殊字符的数据混淆。 你的问题可以通过临时替换反斜杠来解决,但我希望这个答案能引导你到awk

一行:

echo '\newcommand{\VERSION}{0.123},' | tr '\' '\r' | 
   sed -r 's/(.*)(VERSION\}\{0.)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' | tr '\r' '\'

对于一个文件

tr '\' '\r' < fileName.tex | 
   sed -r 's/(.*)(VERSION\}\{0.)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' |
   tr '\r' '\' > fileName.tex.tmp && mv fileName.tex.tmp fileName.tex

\n是唯一的问题时,你可以试试

sed -i -r 's/\\n/\r/g;s/(.*)(VERSION\}\{0.)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge;s/\r/\\n/' fileName.tex

【讨论】:

    【解决方案2】:

    好的,所以我无法从 Cyrus 那里得到答案,因为该文件在我想要修改的 tex 文件中找到了大约 50 行其他行,我不太确定如何修复 awk 语句以找到我想要的特定行。但是,我通过做一个简单的改变让它与原来的 sed 方法一起工作。

    我的 sed 命令变成了两个,第一个创建一个临时字符串 %TMPSTR%,然后立即替换该临时字符串以获得所需的输出并避免出现任何换行符。

    sed -i -r 's/(.*)(VERSION\}\{0.)([0-9]+)(.*)/echo "\\%TMPSTR%{\\\2$((\3+1))\4"/ge' fileName.tex
    sed -i -r 's/%TMPSTR%/newcommand/g' fileName.tex
    
    

    所以文件中的行来自

    \newcommand{\VERSION}{0.123} --> \%TMPSTR%{\VERSION}{0.124} --> \newcommand{\VERSION}{0.124}

    并以期望的结果结束。我想有点难看,但它可以满足我的需要!

    【讨论】:

    • 很好的解决方法。它启发了我编辑我的答案。你真的很努力寻找解决方案!
    • @WalterA 谢谢!我喜欢你添加的解决方案。很高兴我能激发灵感。 :)
    猜你喜欢
    • 2022-07-21
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2014-03-07
    • 2020-03-13
    • 2016-04-30
    • 2020-07-28
    相关资源
    最近更新 更多