使用 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

取决于您的实际计划使用对于这些数据,您可能希望直接将数据读入 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"

相关内容