배열과 for 루프를 사용하면 행이 2개 행으로 분할되는 이유는 무엇입니까? [복사]

배열과 for 루프를 사용하면 행이 2개 행으로 분할되는 이유는 무엇입니까? [복사]

다음이 내가 찾고 있는 줄을 제공하는 이유는 무엇입니까?

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. 그렇지 않으면 행에 정규식 패턴이 포함되어 있으면 실패합니다.

관련 정보