我最近写了一个脚本,该脚本将解析一大堆文件并在整个过程中增加版本号。该脚本适用于除一个文件外的所有文件。它使用下面的sed命令(它是从各种谷歌搜索和非常有限的sed知识拼凑而成的(在.tex文件中找到一行并增加版本号。
sed -i -r 's/(.*)(VERSION}{0.)([0-9]+)(.*)/echo "12$((3+1))4"/ge' fileName.tex
上述问题(我不确定如何解决(是,它发现要更改的行显示为
newcommand{VERSION}{0.123}
,
sed命令用换行符替换上面一行中的"\n",从而输出
ewcommand{VERSION}{0.124}
(前面有一个换行符(。
所需输出为:
newcommand{VERSION}{0.124}
我该怎么解决这个问题?
好吧,所以我无法从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}
并以期望的结果结束。我想有点丑,但它满足了我的需要!
使用awk
,它不会被具有特殊字符的数据所混淆。您的问题可以通过临时替换反斜杠来解决,但我希望这个答案能引导您使用awk
。
对于一行:
echo 'newcommand{VERSION}{0.123},' | tr '' 'r' |
sed -r 's/(.*)(VERSION}{0.)([0-9]+)(.*)/echo "12$((3+1))4"/ge' | tr 'r' ''
对于文件
tr '' 'r' < fileName.tex |
sed -r 's/(.*)(VERSION}{0.)([0-9]+)(.*)/echo "12$((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 "12$((3+1))4"/ge;s/r/\n/' fileName.tex