我是各种形式的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是否可以记住输入,然后将其用于输出的开头?我是否有正确的想法?预先感谢!
答案 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/2
或s/.*/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