패턴과 일치하지 않는 줄을 삭제하는 데 이것을 사용합니다.
$ 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