我在文本文件中有文本行。该行看起来像这样:
xxxx,xxxxx,xxxxxx,xxxxx,xxxx,NL-1111 xx,xxxx,xxx
NL-是国家的标识符,所以这可以是任何东西。我想从线上删除NL部分,所以它看起来像这样:
xxxx,xxxxx,xxxxxx,xxxxx,xxxx,1111 xx,xxxx,xxx
然后写完文件。
提前致谢。
答案 0 :(得分:2)
我认为这里最简单的解决方案是将其从文件中读取到shell变量中,然后立即将其写回并使用参数扩展的模式替换变体:
line="$(<file)"; echo "${line/[a-zA-Z][a-zA-Z]-}" >|file;
我会警告你不要使用sed-in-place功能的解决方案。我发现sed行为在-i选项的不同平台上有所不同。在Mac上你必须给-i选项一个空参数(''
),而在Cygwin上你必须不在-i之后有一个空参数。为了获得平台兼容性,您必须测试自己所处的平台。
答案 1 :(得分:2)
sed -i 's/,[A-Z][A-Z]-\([0-9]\+,\)/,\1/i' file.txt
,[A-Z][A-Z]-\([0-9]\+,\)
搜索逗号,字母,-
,数字,逗号
,\1
只保留逗号和数字。
i
忽略字母上的案例
感谢@chris进行校对。
答案 2 :(得分:2)
另一个接近sed
的解决方案,但使用perl:
perl -i -pe "s/(?<=,)[a-zA-Z]{2}-//g" file.txt
它使用了后面的表达式,因此您不需要在替换部分中重复逗号。
答案 3 :(得分:1)
sed可能会做到这一点:从文件中的任何位置删除字符串“,NL-”,“BE-”等:
sed -i 's/,[A-Z][A-Z]-/,/' file.txt