bash脚本编写:我可以通过sed输出原始行,然后输出空格,然后输出修改后的行吗?

时间:2019-05-27 10:09:47

标签: bash shell awk sed

我是各种形式的Unix的新手,所以请放轻松! 我有一个bash脚本,它将带有任意文件名的ls命令通过管道传输到sed中,该命令将在文件上使用任意替换模式,然后将其通过管道传输到awk中进行某些处理。问题是,awk需要同时知道原始文件名和新文件名。

除了将原始文件名放入awk外,我已经进行了所有管理。例如,假设我的文件为test。*,替换模式为's:es:ar;',它将每次出现的“ test”更改为“ tart”。为了进行测试,我只是使用awk打印接收到的内容:

ls "$@" | sed "$pattern" | awk '{printf "0: %s\n1: %s\n2: %s\n", $0,$1,$2}'

其中test。*在$ @中,模式存储在$ pattern中。 显然,这并不能使我到达想要的位置。输出显然是

0: tart.c
1: tart.c
2:

如果我可以sed输出“ test.c tart.c”,那么我将有两个用于awk的参数。我一直在使用该模式,但都没有用,甚至将“ test.c”硬编码到替换中。但是,当然这给了我诸如“ ttest.c art.c”之类的业余成绩。 sed是否可以记住输入,然后将其用于输出的开头?我是否有正确的想法?预先感谢!

3 个答案:

答案 0 :(得分:1)

复制,更改第一个单词并交换:

echo test.c |  sed -r 's/.*/& &/;s/t/b/;s/([^ ]*) (.*)/\2 \1/'

或更神奇的

echo test.c |  sed 'h;s/t/b/;x;G;s/\n/ /'

答案 1 :(得分:0)

使用Perl代替sed:

echo test.c | perl -lne 'print "$_ ", s/es/ar/r'

-l从输入中删除换行符,并将其添加到每个print之后。 /r替换的修饰符返回修改后的字符串,而不是更改变量(需要Perl 5.14 +)。

旧答案,不适用于s/t/b/2s/.*/replaced/2

您可以使用s/.*/& &/复制该行的内容,然后告诉sed仅应应用第二个替换(至少在GNU sed中有效):

<罢工>
echo test.c | sed 's/.*/& &/; s/es/ar/2'

答案 2 :(得分:0)

$ echo 'foo' | awk '{old=$0; gsub(/o/,"e"); print old, $0}'
foo fee