如何替换除Bash中文件每行最后n个实例之外的所有字符实例
我有一个只有几十行的文件 e、 g 我需要保留日期以及每行末尾日期的括号。但是,正如在第一行中一样,有时括号用于其他地方。我需要用破折号等替换这些支架 理想的输出是:如何替换除Bash中文件每行最后n个实例之外的所有字符实例,bash,awk,sed,character,Bash,Awk,Sed,Character,我有一个只有几十行的文件 e、 g 我需要保留日期以及每行末尾日期的括号。但是,正如在第一行中一样,有时括号用于其他地方。我需要用破折号等替换这些支架 理想的输出是: Vector volume solid option displays -beta version- added to OpenGL Volume (2/22/18). Up to 6 unique sitemap bitmap option added to the OpenGL Volume display (2/19/18)
Vector volume solid option displays -beta version- added to OpenGL Volume (2/22/18).
Up to 6 unique sitemap bitmap option added to the OpenGL Volume display (2/19/18).
Import of Vector-xyza.dat file min/max values on location adjusted to the lower and upper integral values (2/19/18).
如何在bash脚本中实现这一点
提前谢谢。所以这很快又脏,但你明白了:
echo 'Vector volume solid option displays (beta version) added to OpenGL Volume (2/22/18).' | sed -En 's/\(([a-zA-Z])/-\1/p' | sed -nE 's/([a-zA-Z])\)/\1-/p'
Vector volume solid option displays -beta version- added to OpenGL Volume (2/22/18).
如果后跟字母,则第一个sed将替换左括号;如果后跟字母,则下一个sed将替换括号 救援人员:
perl -pe '
$l = tr/(//; $r = tr/)//;
die "Different number of left ($l) and right ($r) brackets.\n"
if $l != $r;
s/\(/-/,s/\)/-/ while --$l;
' -- file
简单sed方法:
sed -E 's/\(([^0-9()]+[^()]+)\)/-\1-/g' file
输出:
Vector volume solid option displays -beta version- added to OpenGL Volume (2/22/18).
Up to 6 unique sitemap bitmap option added to the OpenGL Volume display (2/19/18).
Import of Vector-xyza.dat file min/max values on location adjusted to the lower and upper integral values (2/19/18).
如果你有5个测试版,你可以试试这个sed
sed -E ':A;s/([^(]*)(\()([^)]*)(\))([^(]*)(\([^)]*\).*)/\1-\3-\5\6/;tA' infile
您还需要添加您试图提问的内容。。。将鼠标悬停在downvote按钮上。@Sundeep,在这里提问之前,我搜索了很多地方,但找不到合适的解决方案。你希望我列出所有不合适的谷歌搜索结果吗?希望你能从积极的方面考虑。。在这种情况下,我至少要强调这一点,并尝试使用sed/awk。。就像一个简单的sed's/[]/-/g'。。这将有助于展示你的努力。。标记grep意味着你只是在到处乱扔标签。。grep用于查找文本,不能修改..关于grep的观点;我已经删除了这个标签。但是,您关于包含sed示例的另一点没有意义。我永远不会尝试那个命令,因为它不做需要的事情。那么,为什么我要把它作为我尝试过的东西包括在OP中,而我不会也没有尝试过这样的东西呢?效果非常好。谢谢感谢您的建议,但这对我没有帮助,因为我需要将其作为脚本的一部分运行,其中包含可变文本@罗曼佩雷克里斯特的回答解决了这个问题。谢谢谢谢,乔洛巴。我不确定这是否适合我。。。我没有使用perl的经验,但熟悉sed,所以我选择了@RomanPerekhrest的解决方案。我并不是说你的解决方案不起作用,只是我还没有尝试过,我只是想提醒未来的读者。。。。不过还是谢谢你的建议-
sed -E ':A;s/([^(]*)(\()([^)]*)(\))([^(]*)(\([^)]*\).*)/\1-\3-\5\6/;tA' infile