문자열의 두 단어 사이에있는 모든 것을 포함하는 문자열을 출력하려고합니다.
입력:
"Here is a String"
산출:
"is a"
사용 :
sed -n '/Here/,/String/p'
엔드 포인트를 포함하지만 포함하고 싶지 않습니다.
sed
FAQ는 "특정 행 사이에서 텍스트를 추출하는 방법"입니다. 이것은 stackoverflow.com/questions/16643288/…
문자열의 두 단어 사이에있는 모든 것을 포함하는 문자열을 출력하려고합니다.
입력:
"Here is a String"
산출:
"is a"
사용 :
sed -n '/Here/,/String/p'
엔드 포인트를 포함하지만 포함하고 싶지 않습니다.
sed
FAQ는 "특정 행 사이에서 텍스트를 추출하는 방법"입니다. 이것은 stackoverflow.com/questions/16643288/…
답변:
sed -e 's/Here\(.*\)String/\1/'
echo "Here is a one is a String" | sed -e 's/one is\(.*\)String/\1/'
. "one is"와 "String"사이의 부분 만 원한다면 정규식을 전체 줄과 일치시켜야합니다 sed -e 's/.*one is\(.*\)String.*/\1/'
. sed에서 s/pattern/replacement/
"각 라인의 '패턴'을 '대체'로 바꾸십시오. "라고 말합니다. "패턴"과 일치하는 항목 만 변경하므로 전체 줄을 바꾸려면 "패턴"을 전체 줄과 일치시켜야합니다.
Here is a String Here is a String
GNU grep은 긍정적 & 부정적 예측 및 예측을 지원할 수 있습니다. 귀하의 경우 명령은 다음과 같습니다.
echo "Here is a string" | grep -o -P '(?<=Here).*(?=string)'
Here
and 가 여러 번 나타나는 경우 string
처음 Here
부터 마지막 까지 string
일치시킬 것인지 개별적으로 일치시킬 것인지 선택할 수 있습니다 . 정규 표현식의 관점에서 욕심 일치 (첫 번째 경우) 또는 욕심없는 일치 (두 번째 경우)라고합니다.
$ echo 'Here is a string, and Here is another string.' | grep -oP '(?<=Here).*(?=string)' # Greedy match
is a string, and Here is another
$ echo 'Here is a string, and Here is another string.' | grep -oP '(?<=Here).*?(?=string)' # Non-greedy match (Notice the '?' after '*' in .*)
is a
is another
-P
옵션은 grep
* BSD에 포함되어 있거나 SVR4 (Solaris 등)와 함께 제공되는 옵션에는 없습니다 . FreeBSD에서는 PCRE를 지원 하는 devel/pcre
포트 pcregrep
(및 미리보기 / 뒤) 를 포함 하는 포트를 설치할 수 있습니다 . 이전 버전의 OSX는 GNU grep을 사용했지만 OSX Mavericks에서는 -P
FreeBSD의 버전에서 파생되었으며 옵션이 포함되어 있지 않습니다.
Here is a string a string
, 모두 " is a "
와이 " is a string a "
문제의 요구 사항에 따라 유효한 응답 (따옴표를 무시)이다. 당신이 원하는 것 중 하나에 따라 달라지며 그에 따라 대답이 다를 수 있습니다. 어쨌든, 귀하의 요구 사항에 대해 다음과 같이 작동합니다.echo "Here is a string a string" | grep -o -P '(?<=Here).*?(?=string)'
echo $'Here is \na string' | grep -zoP '(?<=Here)(?s).*(?=string)'
허용 된 답변은 이전 Here
또는 이후에 있을 수있는 텍스트를 제거하지 않습니다 String
. 이것은 :
sed -e 's/.*Here\(.*\)String.*/\1/'
주된 차이는 첨가이다 .*
직전 Here
후의 String
.
.
줄 바꿈과 일치하지 않습니다. 줄 바꿈을 일치 시키려면 .
다음과 같이 바꿀 수 있습니다 [\s\s]
.
Bash 에서만 문자열을 제거 할 수 있습니다 .
$ foo="Here is a String"
$ foo=${foo##*Here }
$ echo "$foo"
is a String
$ foo=${foo%% String*}
$ echo "$foo"
is a
$
그리고 PCRE 가 포함 된 GNU grep이 있으면 너비가 0 인 어설 션을 사용할 수 있습니다.
$ echo "Here is a String" | grep -Po '(?<=(Here )).*(?= String)'
is a
GNU awk를 통해
$ echo "Here is a string" | awk -v FS="(Here|string)" '{print $2}'
is a
grep -P
( perl-regexp ) 매개 변수 support \K
를 사용하면 이전에 일치 한 문자를 버리는 데 도움이됩니다. 이 경우 이전에 일치 한 문자열이 Here
최종 출력에서 삭제되었습니다.
$ echo "Here is a string" | grep -oP 'Here\K.*(?=string)'
is a
$ echo "Here is a string" | grep -oP 'Here\K(?:(?!string).)*'
is a
출력을 원하면 is a
아래를 시도해보십시오.
$ echo "Here is a string" | grep -oP 'Here\s*\K.*(?=\s+string)'
is a
$ echo "Here is a string" | grep -oP 'Here\s*\K(?:(?!\s+string).)*'
is a
echo "Here is a string dfdsf Here is a string" | awk -v FS="(Here|string)" '{print $2}'
, is a
대신 is a is a
@Avinash Raj 이어야합니다.
여러 줄로 된 사건이 많은 긴 파일이 있으면 먼저 번호 줄을 인쇄하는 것이 좋습니다.
cat -n file | sed -n '/Here/,/String/p'
-n
in 옵션을 cat
생략해야합니다.
cat
완전히 생략 할 수 있습니다. sed
파일 또는 표준 입력을 읽는 방법을 알고 있습니다.
sed
명령 을 이해하려면 단계별로 명령을 작성해야합니다.
원본은 여기 있습니다
user@linux:~$ echo "Here is a String"
Here is a String
user@linux:~$
ubstition 옵션으로 Here
문자열 을 제거해 봅시다 s
.sed
user@linux:~$ echo "Here is a String" | sed 's/Here //'
is a String
user@linux:~$
이 시점에서, 나는 당신이 제거 할 수있을 것이라고 생각 String
뿐만 아니라
user@linux:~$ echo "Here is a String" | sed 's/String//'
Here is a
user@linux:~$
그러나 이것은 원하는 출력이 아닙니다.
두 개의 sed 명령을 결합하려면 -e
option을 사용하십시오.
user@linux:~$ echo "Here is a String" | sed -e 's/Here //' -e 's/String//'
is a
user@linux:~$
도움이 되었기를 바랍니다
사용할 수 있습니다 \1
( http://www.grymoire.com/Unix/Sed.html#uh-4 참조 ).
echo "Hello is a String" | sed 's/Hello\(.*\)String/\1/g'
괄호 안에있는 내용은로 저장됩니다 \1
.
문제. 저장된 클로 메일 메시지가 다음과 같이 줄 바꿈되어 제목 줄을 추출하려고합니다.
Subject: [SLC38A9 lysosomal arginine sensor; mTORC1 pathway] Key molecular
link in major cell growth pathway: Findings point to new potential
therapeutic target in pancreatic cancer [mTORC1 Activator SLC38A9 Is
Required to Efflux Essential Amino Acids from Lysosomes and Use Protein as
a Nutrient] [Re: Nutrient sensor in key growth-regulating metabolic pathway
identified [Lysosomal amino acid transporter SLC38A9 signals arginine
sufficiency to mTORC1]]
Message-ID: <20171019190902.18741771@VictoriasJourney.com>
이 스레드의 A2에 따라 sed / grep을 사용하여 두 단어 사이의 텍스트를 추출하는 방법은 무엇입니까? 일치하는 텍스트에 줄 바꿈이 포함되어 있지 않으면 아래의 첫 번째 표현식은 "작동"합니다.
grep -o -P '(?<=Subject: ).*(?=molecular)' corpus/01
[SLC38A9 lysosomal arginine sensor; mTORC1 pathway] Key
그러나 수많은 변형 ( .+?; /s; ...
)을 시도했지만 작동시키지 못했습니다.
grep -o -P '(?<=Subject: ).*(?=link)' corpus/01
grep -o -P '(?<=Subject: ).*(?=therapeutic)' corpus/01
etc.
해결책 1.
sed -n '/Subject: /{:a;N;/Message-ID:/!ba; s/\n/ /g; s/\s\s*/ /g; s/.*Subject: \|Message-ID:.*//g;p}' corpus/01
어느 것이
[SLC38A9 lysosomal arginine sensor; mTORC1 pathway] Key molecular link in major cell growth pathway: Findings point to new potential therapeutic target in pancreatic cancer [mTORC1 Activator SLC38A9 Is Required to Efflux Essential Amino Acids from Lysosomes and Use Protein as a Nutrient] [Re: Nutrient sensor in key growth-regulating metabolic pathway identified [Lysosomal amino acid transporter SLC38A9 signals arginine sufficiency to mTORC1]]
해결책 2. *
Per sed를 사용하여 줄 바꿈 (\ n)을 바꾸려면 어떻게해야합니까?
sed ':a;N;$!ba;s/\n/ /g' corpus/01
줄 바꿈을 공백으로 바꿉니다.
sed / grep를 사용하여 두 단어 사이의 텍스트를 추출하는 방법의 A2와 연결 ? 우리는 다음을 얻습니다.
sed ':a;N;$!ba;s/\n/ /g' corpus/01 | grep -o -P '(?<=Subject: ).*(?=Message-ID:)'
어느 것이
[SLC38A9 lysosomal arginine sensor; mTORC1 pathway] Key molecular link in major cell growth pathway: Findings point to new potential therapeutic target in pancreatic cancer [mTORC1 Activator SLC38A9 Is Required to Efflux Essential Amino Acids from Lysosomes and Use Protein as a Nutrient] [Re: Nutrient sensor in key growth-regulating metabolic pathway identified [Lysosomal amino acid transporter SLC38A9 signals arginine sufficiency to mTORC1]]
이 변형은 이중 공백을 제거합니다.
sed ':a;N;$!ba;s/\n/ /g; s/\s\s*/ /g' corpus/01 | grep -o -P '(?<=Subject: ).*(?=Message-ID:)'
기부
[SLC38A9 lysosomal arginine sensor; mTORC1 pathway] Key molecular link in major cell growth pathway: Findings point to new potential therapeutic target in pancreatic cancer [mTORC1 Activator SLC38A9 Is Required to Efflux Essential Amino Acids from Lysosomes and Use Protein as a Nutrient] [Re: Nutrient sensor in key growth-regulating metabolic pathway identified [Lysosomal amino acid transporter SLC38A9 signals arginine sufficiency to mTORC1]]
Here is a Here String
어떤 경우 결과는 무엇입니까? 아니면I Hereby Dub Thee Sir Stringy
?