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

hwazgwia  于 12个月前  发布在  Linux
关注(0)|答案(7)|浏览(154)

我想把文件的全文翻过来。
如果文件包含以下内容,请说明:

com.e.h/float

字符串
我想得到的输出为:

float/h.e.com


我已经试过命令了:

rev file.txt


但是我已经得到了所有的反向输出:taolf/h.e.moc有没有办法我可以得到所需的输出。请告诉我。谢谢。
以下是示例文件的链接:Sample Text

hgqdbh6s

hgqdbh6s1#

可以使用sedtac

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,那么你可以在一个awk命令中使用4个参数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

u2nhd7ah

u2nhd7ah2#

可以使用Perl吗?

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

字符串
根据PO的标准,这一行反转了f的所有行。
如果喜欢少一个parentesis版本:

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

vngu2lb8

vngu2lb83#

使用您显示的示例,请尝试以下awk代码。

echo 'com.e.h/float' |
awk '
  BEGIN{ FS=OFS="/" }
  {
    num=split($1,arr,".")
    val=""
    for(i=num;i>0;i--){
       val=(val?val ".":"") arr[i]
    }
    print $2,val
  }
'

字符串

vddsk6oq

vddsk6oq4#

对于可移植性,这可以使用任何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"

字符串
这将遍历字符串,抓取字母数字字符串加上后面的字符,颠倒这两个捕获片段的顺序,并将它们前置到输出字符串中。

voase2hg

voase2hg5#

使用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

c0vxltue

c0vxltue6#

试试这个:

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

字符串
返回one two three four
或者:

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


返回four three two one

t2a7ltrp

t2a7ltrp7#

我不知道你到底想要什么,但这个应该管用。
使用任何awk:

awk 'BEGIN {OFS=FS="/"}
    {print $2,
     substr($1,length($1)) "."
     substr($1,length($1)-2,1) "."
     substr($1,1,3)}' input.txt

字符串

相关问题