用于交换每行的第一个和最后一个字符的sed命令

时间:2014-09-08 18:01:32

标签: regex bash unix sed text-processing

我想编写一个单行sed命令来交换每行文件的第一个和最后一个字符。以下显示的命令无法正常工作

 sed 's/\(.\)\(.+\)\(.\)/\3\2\1/' input.txt

我甚至尝试添加行开头和行尾字符

 sed 's/^\(.\)\(.+\)\(.\)$/\3\2\1/' input.txt

它似乎与文件中的任何内容都不匹配。

5 个答案:

答案 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线仍然应该交换开始和结束。