sed를 사용하여 디렉터리의 모든 파일을 수정하고 그에 따라 출력 이름을 지정합니다.

sed를 사용하여 디렉터리의 모든 파일을 수정하고 그에 따라 출력 이름을 지정합니다.

sed 명령이 디렉터리의 모든 파일을 처리하고 결과를 새 파일로 출력하길 원합니다. f가 val1.txt인 경우 출력 파일 이름은 val1_ending.txt여야 합니다. 이것은 echo와 sed를 사용하여 시도했지만 작동하지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다. 감사합니다!

files= ls *.txt

echo "${files}"

for f in ${files}$

do 

echo $f

sed -n -e 's/Trial End/&/p' $f>`  echo $f | sed 's/.txt$/_ended.txt/g' `

done

내 입력 파일의 줄은 다음과 같습니다.

3413476   999.3   549.3  1876.0 32768.0
3413477  1000.7   549.6  1880.0 32768.0
3413478   999.3   551.1  1875.0 32768.0
INPUT   3413485 127
END 3413485     SAMPLES EVENTS  RES   59.84   45.82
MSG 3413491 Trial End   2
MSG 3414099 RECCFG CR 1000 0 0 R

출력에서 "Trial End" 패턴이 있는 모든 줄을 찾고 싶습니다.

MSG 3411256 Trial End   1
MSG 3413491 Trial End   2
MSG 3415678 Trial End   3
MSG 3417842 Trial End   4
MSG 3420114 Trial End   5

답변1

for file in *.txt; do
  grep 'Trial End' "$file" >> "${file%.txt}_ended.txt"
done

내가 사용하는 것은 파일이 이미 존재 하는 경우에만 사용하는 >>것이 아닙니다 . 파일을 자르고 덮어쓰는 대신 파일에 추가합니다.>*_ended.txt>>

또 다른 점은 재사용이 쉽지 않다는 것입니다. 이것을 한 번 실행하면 filename_ended.txt다음 파일이 생성됩니다.패턴 일치그것을 처리하면 filename_ended_ended.txt파일을 얻을 수 있습니다.

향후 이러한 잠재적인 문제를 방지하려면 이러한 파일에 대해 다른 확장자를 사용하는 것이 좋습니다(그런데 유닉스 세계에서는 확장자가 중요하지 않습니다).

for file in *.txt; do grep 'Trial End' "$file" >> "$file.ended"; done

답변2

grep을 사용하는 것은 어떻습니까? 다음을 시도해 보십시오:

for f in *.txt; do
out=$(echo ${f} | sed 's/.txt$/_ended.txt/')
grep 'Trial End' $f > $out
done

관련 정보