Sed
使用 sed 在一行中顯示包含一個或多個模式字元的字元串並忽略其他字元串
我想將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
這很簡單。