【发布时间】:2015-08-23 03:42:36
【问题描述】:
以下数据代表2行文本文件:
1 2340: 2 1930: 1
1 9: 3 4501: 1 45: 1 5620: 2
我想删除“:”后面的空格。所以上述文本文件的输出应该是
1 2340:2 1930:1
1 9:3 4501:1 45:1 5620:2
【问题讨论】:
以下数据代表2行文本文件:
1 2340: 2 1930: 1
1 9: 3 4501: 1 45: 1 5620: 2
我想删除“:”后面的空格。所以上述文本文件的输出应该是
1 2340:2 1930:1
1 9:3 4501:1 45:1 5620:2
【问题讨论】:
$ awk -F': ' -v OFS=":" '{$1=$1}1' file
1 2340:2 1930:1
1 9:3 4501:1 45:1 5620:2
【讨论】:
使用以下内容:如果您想替换“:”字符后跟单个/多个空格(“”或“\t”又名制表符)。
sed -i "s/:[ \t][ \t]*/:/g" filename.txt
或者如果您只想将只有一个可见空格的“:”替换为“:”
sed -i "s/:[ \t]/:/g" filename.txt
PS:
您还可以在 sed 命令中使用其他字符例如:^ 或 # 等代替 /。
例如:sed -i "s#koba#loki#g" filename.txt。
-i 选项(我在上面使用)将更新文件(即就地更新),而不是在屏幕上抛出 std 输出。在您确定要更新的内容之前,请勿使用 -i。首先备份给定文件有时会有所帮助。
【讨论】:
你可以使用:
$ sed -e s"/: /:/g" file.dat
1 2340:2 1930:1
1 9:3 4501:1 45:1 5620:2
解释:
sed -e "COMMAND" 将通过 file.dat` 执行命令。
s 说 sed 代替/: /:/ 是要替换的链和所需的链,由 / 分隔。g 告诉 sed 每行执行一次以上。正如@Tom 评论的那样,引号是更好的单引号,-e 不是必须的,那么:
$ sed 's/: */:/g' file.dat
1 2340:2 1930:1
1 9:3 4501:1 45:1 5620:2
编辑 2 正如@josifoski 评论的那样,空格字符后的 * 将允许多个空格,而不仅仅是一个
您可以在此处阅读一些 sed 文档:
AWK GSUB
$ awk '{gsub(/: */,":"); print}' file.dat
1 2340:2 1930:1
1 9:3 4501:1 45:1 5620:2
【讨论】:
-e 并且您的引用是不规则的 - 在整个周围使用单引号更为常见(并且推荐)命令。