tr 可以与正则表达式一起使用吗?

tr 可以与正则表达式一起使用吗?

我有一个这样的文件:

AAAA  
BBBB  
CCCC   
DDDD   
etc  

单词在单独的行中。我想使用添加它们的引号tr
所以我尝试了以下方法:

1)在每个单词的开头添加引号,即'AAAA

  • tr '^\w$' '\'\w$' <file.txt 不起作用
  • tr '^\w$' ''\w$' <file.txt 不起作用

上述两种情况都会导致命令行卡住。

2)要在末尾添加引号,我尝试过:

tr '\n' ''\n' <file.txt 但这不起作用并且命令行卡住了。

为什么这些正则表达式不能与 一起使用tr

答案1

您不能用 来替换多个这样的东西tr。我会用sed这样做来代替。

例子

$ sed "s/^/'/" file.txt
'AAAA
'BBBB
'CCCC
'DDDD

表示找到每行的开头 ( ^) 并将其替换为单引号 ( ')。

如果您想将“单词”括在单引号中,可以使用以下形式的命令:

$ sed "s/\(.*\)/'\1'/" file.txt
'AAAA'
'BBBB'
'CCCC'
'DDDD'

这次我们将线路上的所有内容保存在临时变量 ( \1) 中。然后我们用这个替换该行'\1'

该命令可以缩写为:使用 GNU 特定开关:

$ sed -r "s/^(.*)$/'&'/" file.txt
'AAAA'
'BBBB'
'CCCC'
'DDDD'

答案2

tr是为了音译。一种流行的用法tr是更改字符串的大小写:

$ echo 'this is a test' | tr a-z A-Z
THIS IS A TEST

某些操作系统版本tr,需要a-z采用以下形式[a-z],在这种情况下,还应该引用:

$ echo 'this is a test' | tr '[a-z]' '[A-Z]'
THIS IS A TEST 

您的系统上已安装该软件包的信息info,tr 页面有一些非常好的示例和tr命令的进一步解释:

info coreutils 'tr invocation'

对于您想要实现的目标,您可能需要使用 sed、perl 或 awk。

珀尔:

perl -pe "s/^/'/" file

对于每一行,匹配行的开头 ( ^),替换为'

塞德:

sed "s/^/'/" file

类似于perl的例子

awk:

awk -v x="'" '{ print x$0 }' foo

将变量 x 指定为'并为每一行打印'然后打印整行

答案3

不,tr仅用于一一替换字符。您不能通过这种方式添加字符。

你可以使用 perl 之类的东西来做到这一点:

perl -pe "s/\w+/'$&'/"

例如,tr您只能用一种引用替换另一种引用:

tr \" \'

这些反斜杠只是告诉你的 shell 按原样发送字符,而不是尝试解释它本身。

这些是行不通的:

tr '"' '''
tr '"' '\''

第一个参数 ( '"') 很好,它与 完全相同\"。在这两种情况下,第二个参数都不起作用:您不能使用单引号来引用单引号,因为第二个引号结束了引用,而第三个引号打开了一个丢失的新引号。 (因此你的 shell 会打开一个新行来等待丢失的结束引号。)

但这一切都只是空壳而已,与我们无关tr

答案4

最快的解决方案通常是使用最简单的单任务实用程序。

tr是一个简单的实用程序,但还可以用于其他用途:音译(将给定字符转换为其他字符)、删除给定字符或压缩字符。

更通用的实用程序,例如sed,awkperl(按大小顺序)可以做到这一点,但在这里,您有一个单任务实用程序也可以很好地完成此操作paste::

paste -d\' /dev/null file.txt /dev/null

或者:

:|paste -d\' - file.txt -

相关内容