다음이 내가 찾고 있는 줄을 제공하는 이유는 무엇입니까?
grep '<appointment-id internal:ref=1.2.3/>' test.xml
OUTPUT is <appointment-id internal:ref=1.2.3/>
그리고 아래에서는 두 줄로 나눕니다.
a=($(grep '<appointment-id internal:ref=1.2.3/>' test.xml))
for i in "${a[@]}"; do
echo "checking $i"
grep -n "$i" delete.xml
done
출력은 다음과 같습니다
checking <appointment-id
checking internal:ref=1.2.3/>
파일은 다음과 같습니다
<note>
<to>Jim</to>
<from>John</from>
<heading>Reminder</heading>
<body>Some text</body>
<appointment-id internal:ref=1.2.3/>
</note>
답변1
의 출력은 grep
공백으로 구분된 두 단어를 포함하는 문자열입니다.
셸은 인용되지 않았기 때문에 이를 두 단어로 분할하므로 배열에는 두 개의 항목이 있습니다.
이것은 당신이 원하는 것을 할 것입니다 :
a=( "$( grep -F '<appointment-id internal:ref=1.2.3/>' test.xml )" )
하지만,XML을 구문 분석하는 것은 grep
끔찍한 생각입니다.. 대신 적절한 XML 파서를 사용하십시오.
또한 루프가 문자열을 출력하는 경우 이를 다음으로 바꿀 수 있습니다.
printf 'checking %s\n' "${arr[@]}"
git
제어된 파일의 특정 버전 (아래 설명 참조) 에서 패턴과 일치하는 행을 누가 변경했는지 확인하려면 git blame -L
해당 패턴과 버전을 사용하십시오. 자세한 내용은 을 참조하세요 git blame --help
.
또한 패턴과 일치하는 줄의 줄 번호를 얻으려면 다음을 수행하십시오.
sed -n '/pattern/=' file
행 번호를 얻기 위해 결과를 다시 입력하지 마십시오 grep
. grep
이렇게 하는 경우 반드시 사용해야 합니다 grep -F
. 그렇지 않으면 행에 정규식 패턴이 포함되어 있으면 실패합니다.