기존 변수를 기반으로 파일 이름을 지정하는 방법은 무엇입니까?

기존 변수를 기반으로 파일 이름을 지정하는 방법은 무엇입니까?

패턴과 일치하지 않는 줄을 삭제하는 데 이것을 사용합니다.

$ egrep "pattern1|pattern2|pattern3|pattern4|pattern5"

하지만 이제 이 작업을 자동으로 수행해야 하므로 다음과 같이 변수를 설정했습니다.

$ catTMP=~/mpp/*.xml

나는 다음과 같은 것을 실행하고 싶습니다 :

$ egrep "pattern1|pattern2|pattern3|pattern4|pattern5" $catTMP > $catTMP.2
^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^__^Here^

기존 변수를 기반으로 리디렉션 이름을 어떻게 설정합니까? 아직도 이해하지 못하신다면 제 말은 다음과 같습니다.

$ cd ~/mpp/
$ ls
x.xml 

$ egrep "pattern1|pattern2|pattern3|pattern4|pattern5" $catTMP > $catTMP.2

$ ls
x.xml x.xml.2

또는 그 자리에서 편집하는 것이 더 좋지만 grep그렇게 할 수 없으므로 다른 명령을 사용하여 이 작업을 수행할 수 있는 방법이 있을 수 있습니다 -i.

답변1

패턴과 일치하는 줄만 유지하여 제자리에서 편집합니다.

sed -n -r -i "/(pattern1|pattern2|pattern3|pattern4|pattern5)/p" ~/mpp/*.xml

BSD sed(Mac OSX)에서는 다음을 시도해 보세요.

sed -n -E -i '' "/(pattern1|pattern2|pattern3|pattern4|pattern5)/p" ~/mpp/*.xml

기존 변수를 기반으로 한 파일 이름

for fname in ~/mpp/*.xml
do
    egrep "pattern1|pattern2|pattern3|pattern4|pattern5" "$fname" > "$fname.2"
done

위의 방법은 변수 이름에 마침표가 적합하지 않기 때문에 작동합니다. 따라서 쉘은 에서 $fname.2변수 이름이 임을 알고 있습니다 fname. 그렇지 않은 경우 중괄호가 필요합니다. 예를 들어:

for fname in ~/mpp/*.xml
do
    egrep "pattern1|pattern2|pattern3|pattern4|pattern5" "$fname" > "${fname}_2"
done

여기서 중괄호는 변수 이름이 이고 fname가 아님을 쉘에 나타냅니다 fname_2.

답변2

사용awk

for x in `ls ~/map/*.xml`;do awk '/(pattern1|pattern2|pattern3|pattern4|pattern5)/{print}' $x > $x.2; done

for는 모든 xml 파일과 awk 찾기 패턴을 반복하며 일치하는 경우 .xml.2에 저장됩니다.

답변3

다음과 같이 사용할 수 있습니다 grep.

for f in /dir/*glob*
do  grep -E 'pattern|list' <<INFILE >"$f"
$(cat "$f")
INFILE
done

각 파일의 모든 후행 빈 줄을 제거 하지만 내 가정은 빈 줄이 사용자 범위에 $f없을 수 있다는 것입니다 .pattern|list

관련 정보