如何在Ubuntu中使用bash反转文件中的所有单词?

问题描述 投票:0回答:5

我想反转文件中的完整文本。
说明文件是否包含:

com.e.h/float

我想要输出为:

float/h.e.com 

我已经尝试过命令:

rev file.txt

但我得到了所有反向输出:

taolf/h.e.moc
有什么方法可以获得所需的输出。请告诉我。谢谢你。
这是示例文件的链接:示例文本

regex linux bash awk sed
5个回答
4
投票

您可以使用

sed
tac
:

str=$(echo 'com.e.h/float' | sed -E 's/(\W+)/\n\1\n/g' | tac | tr -d '\n')

echo "$str"
float/h.e.com
  • 使用
    sed
    ,我们在所有非单词字符之前和之后插入
    \n
  • 使用
    tac
    我们反转输出线。
  • 使用
    tr
    我们删除所有新行。

如果您有 gnu-awk,那么您可以使用 4 个参数在单个 awk 命令中完成所有这些操作

split
函数调用分别填充分割字符串和分隔符:

awk '{
   s = ""
   split($0, arr, /\W+/, seps)
   for (i=length(arr); i>=1; i--)
      s = s seps[i] arr[i]
   print s
}' file

对于非 gnu awk,您可以使用:

awk '{
   r = $0
   i = 0
   while (match(r, /[^a-zA-Z0-9_]+/)) {
      a[++i] = substr(r, RSTART, RLENGTH) substr(r, 0, RSTART-1)
      r = substr(r, RSTART+RLENGTH)
   }
   s = r
   for (j=i; j>=1; j--)
      s = s a[j]
   print s
}' file

3
投票

可以使用Perl吗?

perl -nlE 'say reverse(split("([/.])",$_))'  f

根据 PO 的标准,这一行反转了 f 的所有行。

如果更喜欢少括号版本:

perl -nlE 'say reverse split "([/.])"' f 

0
投票

为了可移植性,可以使用任何 awk(不仅仅是 GNU)使用子字符串来完成此操作:

$ awk '{
    while (match($0,/[[:alnum:]]+/)) {
      s=substr($0,RLENGTH+1,1) substr($0,1,RLENGTH) s;
      $0=substr($0,RLENGTH+2)
    } print s
  }' <<<"com.e.h/float"

这将逐步遍历字符串,抓取字母数字字符串加上以下字符,反转这两个捕获片段的顺序,并将它们添加到输出字符串之前。


0
投票

使用 GNU awk 的

split
,从分隔符
.
/
中拆分,如果您愿意,可以定义更多。

$ cat program.awk
{
    for(n=split($0,a,"[./]",s); n>=1; n--)               # split to a and s, use n from split
        printf "%s%s", a[n], (n==1?ORS:s[(n-1)])         # printf it pretty
}

运行它:

$ echo com.e.h/float | awk -f program.awk 
float/h.e.com

编辑:

如果你想单行运行它:

awk '{for(n=split($0,a,"[./]",s); n>=1; n--); printf "%s%s", a[n], (n==1?ORS:s[(n-1)])}' foo.txt

0
投票

试试这个:

echo $(echo ruof eerht owt eno | fmt -1 | tac | rev)

退货

one two three four

© www.soinside.com 2019 - 2024. All rights reserved.