주어진 문자열에서 시작하여 주어진 문자까지 제거합니다.

주어진 문자열에서 시작하여 주어진 문자까지 제거합니다.
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 스크립틀릿을 묶어야 "하기 때문에 몇 가지 인용 곡예가 진행되고 있으므로 and 로 [^']이스케이프하지 않는 한 쉘은 이를 awk에 전달하기 전에 확장할 것입니다 $1.$2\$1\$2

관련 정보