Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何替换除Bash中文件每行最后n个实例之外的所有字符实例_Bash_Awk_Sed_Character - Fatal编程技术网

如何替换除Bash中文件每行最后n个实例之外的所有字符实例

如何替换除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)

我有一个只有几十行的文件

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).
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