我想反转文件中的完整文本。
说明文件是否包含:
com.e.h/float
我想要输出为:
float/h.e.com
我已经尝试过命令:
rev file.txt
但我得到了所有反向输出:
taolf/h.e.moc
有什么方法可以获得所需的输出。请告诉我。谢谢你。您可以使用
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
可以使用Perl吗?
perl -nlE 'say reverse(split("([/.])",$_))' f
根据 PO 的标准,这一行反转了 f 的所有行。
如果更喜欢少括号版本:
perl -nlE 'say reverse split "([/.])"' f
为了可移植性,可以使用任何 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"
这将逐步遍历字符串,抓取字母数字字符串加上以下字符,反转这两个捕获片段的顺序,并将它们添加到输出字符串之前。
使用 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
试试这个:
echo $(echo ruof eerht owt eno | fmt -1 | tac | rev)
退货
one two three four