我有各种文本文件需要修改
test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat|...
我正在尝试自动化删除“test5232.lop”的过程,包括处理管道,如下所示:
test.xyz|test3.abc|filename.test|file.text|qwerty.bat|...
如果可能的话不需要生成临时文件
答案1
这看起来像是一份工作cut
。告诉它分隔符是|
,我们要指定要删除的字段,而不是要保留的字段 ( --complement
),并且我们要选择字段 3(在本例中要删除)。
代码:
cut -d '|' --complement -f 3
测试:
$ echo 'test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat|x' | cut -d '|' --complement -f 3
test.xyz|test3.abc|filename.test|file.text|qwerty.bat|x
答案2
只需使用 Sed:
sed 's/|test5232\.lop//' file.txt
在澄清请求之前的原始答案:
仅 POSIX 功能,使用塞德:
sed 's/|[^|]*//2' file.txt
如果您知道所有行至少有三个|
符号,则可以使用更直观的形式:
sed 's/[^|]*|//3' file.txt
答案3
要将第三个字段(其中“字段”是“除了管道之外的任何内容,零次或多次,后跟管道”)替换为任何内容:
awk '{$0=gensub(/[^|]*\|/, "", 3); print $0}' input
显然你想删除行中任何地方的“test5232.lop”:
sed -i 's/|test5232\.lop//' input
(尽管任何解决方案,包括sed -i
创建临时文件)
答案4
另请检查这个 awk 简单解决方案。无论字符串在哪里,都会将其删除,并且应该是可移植的:
$ a="test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat"
$ awk -F"test5232.lop." '{printf("%s%s\n",$1,$2)}' <<<"$a"
test.xyz|test3.abc|filename.test|file.text|qwerty.bat
关于您对就地编辑的请求,GNU AWK版本> 4.1也可以根据呆呆手册:
awk -i inplace -v INPLACE_SUFFIX=.bak '{...}'
但无论如何,awk、sed、perl 都无法实现真正的就地编辑。 GNUsed
信息页面为我们澄清了这个问题:
'-i[SUFFIX]'
'--in-place[=SUFFIX]'
This option specifies that files are to be edited in-place. GNU
'sed' does this by creating a temporary file and sending output to
this file rather than to the standard output.(1).
这意味着您可以通过在末尾附加类似以下内容来使用此处的任何解决方案:
awk/sed/perl/whatever oldfile >tmpfile && mvtmpfile oldfile && rm -f tmpfile