删除直到从给定字符串开始的给定字符

删除直到从给定字符串开始的给定字符
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

相关内容