【问题标题】:i have to replace all the ? with X in unix except some valid?我必须更换所有的?与 X 在 unix 除了一些有效?
【发布时间】:2021-08-12 17:52:41
【问题描述】:

这是一个复杂的问题。我要全部换掉?在带有 X 的文件中。但问题是有一些有效的?也在输入文件中。

例如:

输入:

HELLO ?, WELCOME TO THE NEW WORLD??23, and you are most ? valid person.

输出:

HELLO X, WELCOME TO THE NEW WORLDX?23, and you are most X valid person.

这里,?在 23 之前是有效的 .. 像 23 一样,有很多值。 ?24、?33、?45等,

我尝试使用 sed 脚本,但能够找到确切的命令。

我使用的脚本:

LINE_NUM=0 

while IFS= read -r LINE    
do  
LINE_NUM=$?   
EXTRACTED=`echo "${LINE}" |grep '?23' |  sed 's|^.*\?23||; s|\?[0-9].*$||'`

if [ -n "$EXTRACTED" ]    
then    
UPDATED=`echo "$EXTRACTED" | sed 's/?/X/g'`    
UPDATED_1=`echo "$UPDATED" | awk '{gsub("/","%",$0); print}'`    
if [ $EXTRACTED != $UPDATED ]   
then    
LATEST_VALUE=`echo  "${LINE}" | sed "s|${EXTRACTED}|${UPDATED}|g"`    
fi

LATEST_VALUE=`echo  "${LINE}"`    
echo "$LATEST_VALUE"  >> outputfile.txt   
else    
echo "$LINE" >> outputfile.txt    
fi   
done<inputfile.txt

【问题讨论】:

  • 欢迎来到 SO,请在您的问题中以代码的形式添加您的努力,这在 SO 上受到强烈鼓励,谢谢。
  • @RavinderSingh13 发布了我开发的脚本
  • 请将您的脚本复制/粘贴到shellcheck.net 并修复它会告诉您的所有问题。还要阅读why-is-using-a-shell-loop-to-process-text-considered-bad-practice,因为根本不编写外壳读取循环来执行此操作。
  • 您需要能够用英语定义哪些是有效的,哪些是无效的。然后就可以写代码解决问题了。

标签: unix awk sed


【解决方案1】:

使用您展示的示例,请尝试以下操作。在 GNU awk 请尝试关注。简单的解释是,将记录分隔符设置为 1 ?后跟 1 位数字,使用全局替换将当前记录中的 ? 替换为 X;设置正确的输出记录分隔符为 RT,然后打印当前行。

awk -v RS='[?][0-9]' '{gsub(/\?/,"X");ORS=RT} 1' Input_file

【讨论】:

    【解决方案2】:
    $ echo "HELLO ?, WELCOME TO THE NEW WORLD??23, and you are most ? valid person." | 
      sed -E 's/\?([^0-9]|$)/X\1/g'
    
    
    HELLO X, WELCOME TO THE NEW WORLDX?23, and you are most X valid person.
    

    这里它转义?,后跟一个数字(或行尾)。如果您的列表受到更多限制,请更改那里的正则表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 2019-06-10
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      相关资源
      最近更新 更多