sed를 사용하여 한 줄에 하나 이상의 패턴 문자가 포함된 문자열을 표시하고 다른 문자열은 무시합니다.

sed를 사용하여 한 줄에 하나 이상의 패턴 문자가 포함된 문자열을 표시하고 다른 문자열은 무시합니다.

결과를 전달하고 싶습니다.sed 명령파일의 각 줄의 일부만 읽으려면 변수에 추가하십시오. 예를 들어, "fic1.txt"라는 입력 파일의 내용은 다음과 같습니다.

-->고양이소설 1.txt:

/data/test/AAAA1.txt: text/plain; charset=us-ascii
/data/test/AAAA2.txt: text/plain; charset=us-ascii
/data/test/AAAA3.txt: text/plain; charset=us-ascii
/data/test/BBBB1.txt: text/plain; charset=iso-8859-1
/data/test/BBBB2.txt: text/plain; charset=iso-8859-1
/data/test/BBBB3.txt: text/plain; charset=iso-8859-1
/data/test/BBBB4.txt: text/plain; charset=iso-8859-1
/data/test/CCCC1.txt: text/plain; charset=iso-8859-1
/data/test/CCCC2.txt: text/plain; charset=unknown-8bit

그래서 나는 사용하고 싶다sed는 결과를 변수에 전달합니다., 예를 들어:

->출력 결과 1:

us-ascii
us-ascii
us-ascii
iso-8859-1
iso-8859-1
iso-8859-1
iso-8859-1
iso-8859-1
unknown-8bit

->출력 결과 2:

/data/test/AAAA1.txt
/data/test/AAAA2.txt
/data/test/AAAA3.txt
/data/test/BBBB1.txt
/data/test/BBBB2.txt
/data/test/BBBB3.txt
/data/test/BBBB4.txt
/data/test/CCCC1.txt
/data/test/CCCC2.txt

첫 번째 출력에서는 다음과 같은 sed 명령을 사용했습니다.

var_type_fic=`cat fic1.txt |sed -r 's/.*charset=([^ ]+).*/\1/'|sort`

for fic in $var_type_fic; do
   echo "$fic"
done

하지만 두 번째 경우에는 잘 어울리는 정규식 일치 항목을 찾을 수 없습니다. 누구든지 도와줄 수 있나요?

답변1

잘못된 도구를 사용하고 있습니다. 읽다 man cut,

cut -d= -f2 fic1.txt
cut '-d:'  -f1 fic1.txt

그것은 간단합니다.

답변2

이것은가장 단순한cut행위를 완수했다답변에 표시된 waltinator, 하지만 귀하께서 해결 방법을 요청하셨기 때문에 sed다음은 그 중 하나입니다.

#n
# The above turns off the default output, just like using -n on the
# command line would do (#n must be the first two characters of the
# script).

# Save the original line to the hold space.
h

# Remove all up to and including the last equal sign.
# Write the modified text to "Output_result1".
s/.*=//
w Output_result1

# Fetch the original line from the hold space.
g

# Remove all from and including the first colon.
# Write the modified text to "Output_result2".
s/:.*//
w Output_result2

테스트해보세요:

$ sed -f script file
$ cat Output_result1
us-ascii
us-ascii
us-ascii
iso-8859-1
iso-8859-1
iso-8859-1
iso-8859-1
iso-8859-1
unknown-8bit
$ cat Output_result2
/data/test/AAAA1.txt
/data/test/AAAA2.txt
/data/test/AAAA3.txt
/data/test/BBBB1.txt
/data/test/BBBB2.txt
/data/test/BBBB3.txt
/data/test/BBBB4.txt
/data/test/CCCC1.txt
/data/test/CCCC2.txt

별도의 스크립트를 사용하지 않고:

sed -n  -e h -e 's/.*=//' -e 'w Output_result1' \
        -e g -e 's/:.*//' -e 'w Output_result2' file

실제 계획에 따라 다름사용이 데이터의 경우 데이터를 쉘 변수로 직접 읽을 수 있습니다. 구분 기호로 :and 를 사용하면 =간단한 루프로 이 작업을 수행할 수 있습니다 .

#!/bin/sh

while IFS=':=' read -r pathname junk charset
do
        printf 'pathname="%s"\tcharset="%s"\n' "$pathname" "$charset"
done <file

주어진 데이터에 대해 다음이 출력됩니다.

pathname="/data/test/AAAA1.txt" charset="us-ascii"
pathname="/data/test/AAAA2.txt" charset="us-ascii"
pathname="/data/test/AAAA3.txt" charset="us-ascii"
pathname="/data/test/BBBB1.txt" charset="iso-8859-1"
pathname="/data/test/BBBB2.txt" charset="iso-8859-1"
pathname="/data/test/BBBB3.txt" charset="iso-8859-1"
pathname="/data/test/BBBB4.txt" charset="iso-8859-1"
pathname="/data/test/CCCC1.txt" charset="iso-8859-1"
pathname="/data/test/CCCC2.txt" charset="unknown-8bit"

관련 정보