我有一个这样的文件test.txt
(但包含更多行)
/foo/bar/how hello
/foo/bar/are hello
/foo/bar/you hello
我想得到这个输出:
/foo/bar/how how
/foo/bar/are are
/foo/bar/you you
我试过这个:
while read line
do
bla=$(echo $line | cut -f4 -d"/" | cut -f1 -d" ")
sed -i "s/hello/$bla/"
done <test.txt
但输出是:
sed: no input files
sed: no input files
sed: no input files
当我提供文件名(while read line; do bla=$(echo $line | cut -f4 -d"/" | cut -f1 -d" "); sed -i "s/hello/$bla/" test.txt ; done <test.txt
)时,我明白了:
/foo/bar/how how
/foo/bar/are how
/foo/bar/you how
我想在每一行上用一个出现在同一行之前的模式替换一些常量模式,并且逐行变化。关于我如何做到这一点的任何想法(使用sed或awk)?非常感谢!
答案 0 :(得分:2)
$ sed 's~\([^/]*\) .*~\1 \1~' file
/foo/bar/how how
/foo/bar/are are
/foo/bar/you you
答案 1 :(得分:2)
低于awk
解决方案可能会有所帮助
awk '{$2=$1;sub(/.*\//,"",$2)}1' test.txt
<强>输出继电器强>
/foo/bar/how how
/foo/bar/are are
/foo/bar/you you
备注强>
awk
字段是以空格分隔的,因此您有两个字段,即$1
和$2
。$2=$1
/
将部分剥离到最后sub(/.*\//,"",$2)
。1
最后是最简单的awk
命令,用于打印每条记录。答案 2 :(得分:1)
试试这个:
$ sed 's~\(.*/\)\([^ ]*\) .*~\1\2 \2~' test.txt
/foo/bar/how how
/foo/bar/are are
/foo/bar/you you
使用-i
选项编辑文件 :
sed -i 's~\(.*/\)\([^ ]*\) .*~\1\2 \2~' test.txt
<强>解释强>
s
:替换\(.*/\)\
:任何字符,最后为/
\([^ ]*\)
:任何非空格字符后跟空格使用反向引用,匹配模式的字符串将替换为:第一个组(/foo/bar/
),然后是重复的第二个组(最后一个/
之后的单词:how
,{{1 }或are
)。