Sed

使用 sed 在一行中顯示包含一個或多個模式字元的字元串並忽略其他字元串

  • January 14, 2022

我想將sed 命令的結果傳遞給一個變數,以僅讀取文件每一行的一部分。例如,這是我的名為“fic1.txt”的輸入文件的內容:

–>貓 fic1.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 將結果傳遞給 variable,例如:

->輸出結果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

但是對於第二個,我找不到執行良好的正則表達式匹配。有人可以幫忙嗎?

正如waltinator 在他們的回答中所展示的那樣,這是最容易完成的,但是既然您詢問解決方案,這裡是其中之一:cut``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

根據您實際計劃如何使用這些數據,您可能希望直接將數據讀入 shell 變數。如果你使用: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"

你使用了錯誤的工具。閱讀man cut

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

這很簡單。

引用自:https://unix.stackexchange.com/questions/686372