我想编写一个单行sed命令来交换每行文件的第一个和最后一个字符。以下显示的命令无法正常工作
sed 's/\(.\)\(.+\)\(.\)/\3\2\1/' input.txt
我甚至尝试添加行开头和行尾字符
sed 's/^\(.\)\(.+\)\(.\)$/\3\2\1/' input.txt
它似乎与文件中的任何内容都不匹配。
答案 0 :(得分:2)
sed -E 's/(.)(.+)(.)/\3\2\1/' input.txt
答案 1 :(得分:1)
您需要转义+
,
sed 's/^\(.\)\(.\+\)\(.\)$/\3\2\1/' input.txt
答案 2 :(得分:1)
如果你想尝试其他一些,这里有一个gnu awk
版本
awk '{a=$1;$1=$NF;$NF=a}1' FS= OFS= input.txt
这会将a
设置为第一个字符,然后设置为第一个字符,最后设置为a
它需要gnu awk
,因为设置FS
为空,不在标准awk
答案 3 :(得分:1)
这适用于便携式:
abcd | sed 's/^\(.\)\(.*\)\(.\)$/\3\2\1/'
您可以使用.*
。打印
dbca
也适用于ad
,例如
echo ad | sed 's/^\(.\)\(.*\)\(.\)$/\3\2\1/'
打印
da
每个.+
都不知道sed
,例如例如,它不适用于OS X.因此,我建议使用.*
或使用.+
模拟..*
,例如
echo ad | sed 's/^\(.\)\(..*\)\(.\)$/\3\2\1/'
打印
ad #not swaps
答案 4 :(得分:0)
echo 'are' | sed 's/\(.\)\(.*\)\(.\)/\3\2\1/'
^
也不需要$
因为默认情况下最大可能(因此整行)*
代替+
,因为使用+
至少需要3个char行才能使2 char线仍然应该交换开始和结束。