root@server:~/foo$ cat INPUT.txt
limit. Current u'^'ZO
limit. Current usage'^'FR
limit. Current us'^'AS
limit. Current usage 95 %.'^'FR
limit. Cur'^'AEW
root@server:~/foo$ sed "s/limit.SOMEMAGIC/limit./g" INPUT.txt
limit.'^'ZO
limit.'^'FR
limit.'^'AS
limit.'^'FR
limit.'^'AEW
问题:我们如何删除“limit”后面的字符串(“Cur......”)。直到: ” ' ” ?正在搜索“SOMEMAGIC”:)
答案1
您可以使用:
sed -e "s/^\(limit\.\)[^']*/\1/" < data
这匹配limit.
行的开头,后跟尽可能多的字符那不是'
,并仅将其替换为开头 ( \1
) 的部分。您可以根据数据的实际情况编辑模式和替换 - 重要的部分是[^']*
。
答案2
使用perl
(版本> 5.10.0):
$ perl -pe "s/^limit\.\K(.*?)\'/\'/" file
limit.'^'ZO
limit.'^'FR
limit.'^'AS
limit.'^'FR
limit.'^'AEW
从perldoc perlrebackslash
:
\K This appeared in perl 5.10.0. Anything matched left of "\K" is not
included in $&, and will not be replaced if the pattern is used in a
substitution. This lets you write "s/PAT1 \K PAT2/REPL/x" instead of
"s/(PAT1) PAT2/${1}REPL/x" or "s/(?<=PAT1) PAT2/REPL/x".
Mnemonic: Keep.
答案3
根据您显示的具体输入,您可以简单地执行以下操作
perl -pe "s/ Cur[^']*//" INPUT.txt
或者,在sed
sed "s/ Cur[^']*//" INPUT.txt
这些将简单地删除后面的空格以及尽可能Cur
多的非字符。'
如果你需要这样做仅有的如果前一个词是limit.
,请使用其他答案之一或:
awk "\$1~/limit\./{sub(/Cur[^']*/,\"\",\$2)}1;" INPUT.txt
那里发生了一些引用杂技,因为我们需要将 awk scriptlet 括起来,"
因为我们需要 ,[^']
所以 shell 将在它们传递给 awk 之前展开,除非我们将它们转义$1
为和。$2
\$1
\$2